home *** CD-ROM | disk | FTP | other *** search
- /* bdos utilities */
- #include <stdio.h>
- #include "make.h"
-
- #if MSC
- #include <process.h>
- #include <ctype.h>
- #endif
-
- #if CI86
- /* bdos function defs */
-
- #define O_FIND_FIRST 0x4E00
- #define O_FIND_NEXT 0x4F
- #define O_SET_DTA 0x1A
- #define O_RET_CODE 0x4d
-
- struct regval {
- unsigned ax, bx, cx, dx, si, di, ds, es;
- };
-
- struct segs {
- unsigned scs, sss, sds, ses;
- };
-
- extern char *DRIVE;
- struct dta dta;
-
- find_next()
- {
- return(bdos(O_FIND_NEXT,0));
- }
-
- err_code()
- {
- return(bdos(O_RET_CODE,0));
- }
-
- find_first(name)
- unsigned char *name;
- {
- struct regval srv;
- struct segs rv;
- unsigned char *kludge;
-
- set_dta();
- kludge = name;
- while(*kludge){
- if(isspace(*kludge)) {
- *kludge = NUL;
- break;
- }
- else kludge++;
- }
- segread(&rv);
- srv.ds = rv.sds;
- srv.es = rv.ses;
- srv.cx = 0;
- srv.ax = (O_FIND_FIRST);
- srv.dx = (unsigned int )name;
- return ( sysint21(&srv,&srv) & 1);
- }
-
- /* the following function must be called prior to using the
- file date/time function
- */
- set_dta()
- {
- bdos(O_SET_DTA,&dta);
- return;
- }
-
- char temp[20];
-
- badsys(bname,code)
- int code;
- char *bname;
- {
-
- switch (code) {
-
- case 1:
- error("'%s' not found",bname);
- break;
-
- case 2:
- error("system: COMSPEC not found");
- break;
-
- case 8:
- error("system\(\): insufficient memory");
- break;
-
- default:
- sprintf(temp,"%d",code);
- error("error %s from 'system' call",temp);
- break;
- }
- }
-
-
- baddo_sys(bname,code)
- int code;
- char *bname;
- {
- switch (code) {
-
- case 1:
- error("file not found");
- break;
-
- case 2:
- error("Can't find '%s'",bname);
- break;
-
- case 3:
- error("Command too long");
- break;
-
- case 8:
- error("do_sys\(\): insufficient memory");
- break;
-
- default:
- sprintf(temp,"%d",code);
- error2("DOS error %s from '%s' call",temp,bname);
- break;
- }
- }
-
- /* what follows is the 'system' command as given in the c86 library,
- munged to accept full pathnames ( this ain't much changed from the
- original, so I accept no blame )
- */
- /* run a program under the system function
- returns zero if succesful
- */
-
- #if _C86_BIG
-
- do_sys(prog,args)
- unsigned char *prog,*args;
- {
- panic("panic: This program should be compiled with the SMALL model");
- }
-
- #else
-
- do_sys(prog,args)
- unsigned char *prog,*args;
- {
-
- struct regval srv;
- struct {
- int env_seg;
- char *line_off,*line_seg;
- char *fcb1_off,*fcb1_seg;
- char *fcb2_off,*fcb2_seg;
- } ctrl;
- unsigned char cline[128],newname[128];
- strcpy(newname,DRIVE);
- strcat(newname,prog);
- uppercase(newname);
-
- if( strlen(prog)+strlen(args) > 123 )return( 3 ); /* too long to use */
- srv.ax=0x4800;
- srv.bx=0xfff0; /* look for a lot of memory */
- if((sysint21(&srv,&srv)&1) && srv.bx<(64*17)) return( 8 );
- cline[0]=strlen(args);
- strcpy(cline+1,args);
- segread(&srv.si);
- ctrl.env_seg=0;
- ctrl.line_off=cline;
- ctrl.line_seg=srv.ds;
- return( loadexec(newname,srv.ds,&ctrl,srv.ds,0) );
-
- }
-
- #endif
-
- long now()
- {
- struct regval srv;
- int date[4];
- long ldate;
-
- srv.ax = 0x2a00; /* get system date */
- sysint21(&srv,&srv);
- date[0] = srv.cx;
- date[1] = srv.dx;
-
- srv.ax = 0x2c00; /* get sytem time */
- sysint21(&srv,&srv);
- date[2] = srv.cx;
- date[3] = srv.dx;
-
- ldate = (long)(0x7F & (date[0] - 1980)); /* year - 1980 */
- ldate <<= 4;
- ldate += (long)(0xF & (date[1] >> 8)); /* month */
- ldate <<= 5;
- ldate += (long)(0x1F & date[1]); /* day */
- ldate <<= 5;
- ldate += (long)(0x1F & (date[2] >> 8)); /* hour */
- ldate <<= 6;
- ldate += (long)(0x3F & date[2]); /* minute */
- ldate <<= 5;
- ldate += (long)(0x1E & (date[3] >> 7)); /* seconds * 2 */
- return( ldate );
- }
-
-
- #endif
-
-
- #if UNIX
- /* just some stuff to make it compile on the VAX, for debugging */
- find_next(){return(1);}
- isspace(c) char c;{return (c == ' '||c == '\t'||c == '\n');}
- toupper(c)char c;{return ( (c >= 'a' && c <= 'z') ? c + 'A' - 'a' : c);}
- system(){printf("system call \n");}
- do_sys(){printf("do_sys call \n");}
- badsys(x){printf("bad system call\n");}
- baddo_sys(x){printf("bad do_sys call\n");}
- err_code(){return(0);}
- struct dta dta;
- find_first(){printf("finding first\n");}
- now(){return(0);}
- #endif
-
- #if LC
-
- #define byte char
-
- struct XREG
- {
- short ax,bx,cx,dx,si,di;
- };
-
- struct HREG
- {
- byte al,ah,bl,bh,cl,ch,dl,dh;
- };
-
- union REGS
- {
- struct XREG x;
- struct HREG h;
- };
-
- struct SREGS
- {
- short es,cs,ss,ds;
- };
-
-
- extern int _stack;
-
- struct dta dta;
- extern char *DRIVE;
-
- isspace(c) char *c;{return (c == ' '||c == '\t'||c == '\n'||c == '\r');}
-
- find_first(name)
- char *name;
- {
- union REGS srv;
- struct SREGS rv;
- char *kludge;
-
- set_dta();
- kludge = name;
- while(*kludge){
- if(isspace(*kludge)) {
- *kludge = NUL;
- break;
- }
- else kludge++;
- }
- segread(&rv);
- srv.x.cx = 0;
- srv.h.ah = 0x4E;
- srv.x.dx = ( unsigned )name;
- return( intdosx(&srv,&srv,&rv) & 1 );
-
- }
-
- long now()
- {
-
- union REGS srv;
- int date[4];
- long ldate;
-
- srv.x.ax = 0x2a00; /* get system date */
- intdos(&srv,&srv);
- date[0] = srv.x.cx;
- date[1] = srv.x.dx;
-
- srv.x.ax = 0x2c00; /* get sytem time */
- intdos(&srv,&srv);
- date[2] = srv.x.cx;
- date[3] = srv.x.dx;
-
- ldate = (long)(0x7F & (date[0] - 1980)); /* year - 1980 */
- ldate <<= 4;
- ldate += (long)(0xF & (date[1] >> 8)); /* month */
- ldate <<= 5;
- ldate += (long)(0x1F & date[1]); /* day */
- ldate <<= 5;
- ldate += (long)(0x1F & (date[2] >> 8)); /* hour */
- ldate <<= 6;
- ldate += (long)(0x3F & date[2]); /* minute */
- ldate <<= 5;
- ldate += (long)(0x1E & (date[3] >> 7)); /* seconds * 2 */
- return( ldate );
- }
-
-
- err_code() {
- return(bdos(0x4d,0,0));
- }
-
- find_next() {
- return(bdos(0x4F,0,0));
- }
- set_dta() {
- bdos(0x1A,&dta,0);
- return;
- }
-
- badsys(bname,code)
- int code;
- char *bname;
- {
- error("Can't run '%s'",bname);
- }
-
- baddo_sys(name,code)
- char *name;
- int code;
- {
- char temp[20];
-
- switch ( code ) {
-
- case 2:
- error("File not found '%s'",name);
- break;
-
- case 3:
- error("Command too long");
- break;
-
- case 8:
- error("Not enough memory");
- break;
-
- default:
- sprintf(temp,"%d",code);
- error2("DOS error %s trying to execute '%s'",temp,name);
- break;
- }
- }
-
- do_sys(prog,args)
- char *prog,*args;
- {
- union REGS srv;
- struct SREGS rv;
- char cline[128],newname[128];
- strcpy(newname,DRIVE);
- strcat(newname,prog);
- uppercase(newname);
-
- if ( strlen(prog)+strlen(args) > 123 ) return( 3 );
-
- cline[0] = strlen(args);
- strcpy(cline+1,args); /* easier to put string in right format here */
-
- /* lcload expects a command processor with drive and full pathname
- and the args to have the length prepended
- */
- return( lcload(newname,cline) );
-
- }
- #endif
-
- #if MSC
-
- #define byte char
-
- struct XREG
- {
- short ax,bx,cx,dx,si,di;
- };
-
- struct HREG
- {
- byte al,ah,bl,bh,cl,ch,dl,dh;
- };
-
- union REGS
- {
- struct XREG x;
- struct HREG h;
- };
-
- struct SREGS
- {
- short es,cs,ss,ds;
- };
-
- extern int _stack;
- struct dta dta;
- extern char *DRIVE;
-
- find_first(name)
- char *name;
- {
- union REGS srv;
- struct SREGS rv;
- char *kludge;
-
- set_dta();
- kludge = name;
- while(*kludge){
- if(isspace(*kludge)) {
- *kludge = NUL;
- break;
- }
- else kludge++;
- }
- segread(&rv);
- srv.x.cx = 0;
- srv.h.ah = 0x4E;
- srv.x.dx = ( unsigned )name;
- return( intdosx(&srv,&srv,&rv) & 1 );
-
- }
-
- long now()
- {
- union REGS srv;
- int date[4];
- long ldate;
-
- srv.x.ax = 0x2a00; /* get system date */
- intdos(&srv,&srv);
- date[0] = srv.x.cx;
- date[1] = srv.x.dx;
-
- srv.x.ax = 0x2c00; /* get sytem time */
- intdos(&srv,&srv);
- date[2] = srv.x.cx;
- date[3] = srv.x.dx;
-
- ldate = (long)(0x7F & (date[0] - 1980)); /* year - 1980 */
- ldate <<= 4;
- ldate += (long)(0xF & (date[1] >> 8)); /* month */
- ldate <<= 5;
- ldate += (long)(0x1F & date[1]); /* day */
- ldate <<= 5;
- ldate += (long)(0x1F & (date[2] >> 8)); /* hour */
- ldate <<= 6;
- ldate += (long)(0x3F & date[2]); /* minute */
- ldate <<= 5;
- ldate += (long)(0x1E & (date[3] >> 7)); /* seconds * 2 */
- return( ldate );
- }
-
- int err_code() {
- return(bdos(0x4D,0,0));
- }
-
- find_next() {
- return(bdos(0x4F,0,0));
- }
-
- set_dta() {
- bdos(0x1A,&dta,0);
- return;
- }
-
- badsys(bname,code)
- int code;
- char *bname;
- {
- error("Can't run '%s'",bname);
- }
-
- baddo_sys(name,code)
- char *name;
- int code;
- {
- char temp[20];
-
- switch ( code ) {
-
- case 2:
- error("File not found '%s'",name);
- break;
-
- case 3:
- error("Command too long");
- break;
-
- case 8:
- error("Not enough memory");
- break;
-
- default:
- sprintf(temp,"%d",code);
- error2("DOS error %s trying to execute '%s'",temp,name);
- break;
- }
- }
-
- do_sys(prog,args,lflag)
- char *prog,*args;
- int lflag;
- {
- char newname[128];
- char clist[128];
- char *clistptr;
- char *arglist[100];
- int i;
-
- strcpy(clist,args);
- if (lflag)
- strcpy(newname,DRIVE);
- else
- *newname = '\0';
- strcat(newname,prog);
- uppercase(newname);
- if ( strlen(prog)+strlen(args) > 123 )
- return( 3 );
- i = 1;
- clistptr = args;
- while (*clistptr){
- if (!isspace(*clistptr)){
- arglist[i++] = clistptr;
- while (*(++clistptr) && !isspace(*clistptr)) ;
- if (*clistptr)
- *clistptr = '\0';
- else
- break;
- }
- ++clistptr;
- }
- arglist[i] = NULL;
- if (lflag)
- return(spawnv(P_WAIT,newname,arglist));
- else
- return(spawnvp(P_WAIT,newname,arglist));
- }
- #endif
-